package word;

import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import org.jfree.data.general.DefaultPieDataset;
import org.junit.Test;

import java.io.*;
import java.util.List;

import com.itextpdf.text.Element;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;

import javax.swing.*;
import java.awt.*;
import java.io.FileOutputStream;


/**
 * 需要引入相关 jar
 * org.apache.poi:poi
 * org.apache.poi:poi-ooxml
 * org.apache.poi:poi-ooxml-schemas
 *
 *
 * 如果你只处理老版本的Office文件（.xls, .doc），可能只需要poi库。
 * 处理.xlsx, .docx等XML格式的文件时，你需要同时引入poi和poi-ooxml，
 *      因为后者依赖前者，并且提供了处理这些新格式的功能。
 * poi-ooxml-schemas虽然不是每次都需要，但对于确保生成的文档结构正确，
 *          特别是在复杂的文档处理场景下，是非常推荐加入的依赖，因为它提供了详细的XML模式验证能力。
 */
public class 操作word {
    /**
     * XWPFDocument:
     *      这个类代表一个Word文档。
     *      它是操作Word文件的入口点，允许你创建新的文档，读取现有的文档，添加或删除段落、表格、图片等元素。
     * XWPFTable:
     *      表示Word文档中的表格。
     *      你可以使用这个类来创建新的表格，获取或设置表格的属性（比如宽度、边框样式），以及操作表格中的行和单元格。
     * XWPFParagraph:
     *      代表文档中的一个段落。
     *      段落可以包含文本、图片、表格等多种元素。
     *      你可以使用这个类来创建新的段落，设置对齐方式、缩进、间距等格式，以及添加或删除段落中的文本或其它内容。
     * XWPFTableCell:
     *          单元格类，表示表格中的一个单元格。
     *          你可以通过这个类来设置单元格的内容（包括文本和嵌入的对象）、样式（如背景色、边框）以及合并或拆分单元格等。
     * XWPFRun:
     *          运行对象，是段落中最基本的文本处理单位。
     *          一个段落可以由一个或多个run组成，每个run可以有不同的字体样式、颜色、大小等。
     *          当你需要在同一个段落中应用不同的格式时，就会用到多个run。
     *          例如，改变文本颜色、加粗或斜体等操作都是通过对特定的run进行设置来实现的。
     */
    @Test
    public void 基本操作() throws Exception {
        //D:\Win10Driver\OneDrive\桌面\上海市临港地区人才租房补贴申请表.docx
        File file = new File("D:\\Win10Driver\\OneDrive\\桌面\\上海市临港地区人才租房补贴申请表.docx");
        File file2 = new File("D:\\Win10Driver\\OneDrive\\桌面\\上海市临港地区人才租房补贴申请表222.docx");
        FileInputStream fileInputStream = new FileInputStream(file);
//        XWPFDocument xwpfDocument = new XWPFDocument(fileInputStream);
        // 加载现有的Word文档
        XWPFDocument doc = new XWPFDocument(fileInputStream);

        XWPFParagraph watermark = doc.createParagraph();

        XWPFRun run = watermark.createRun();
        run.setText("Confidential");
        run.setColor("FF0000");
        run.setFontSize(72);
        for (XWPFParagraph paragraph : doc.getParagraphs()) {
            for (XWPFRun r : paragraph.getRuns()) {
                r.setBold(true);
                r.setFontSize(12);
            }
        }
        FileOutputStream out = new FileOutputStream(file2);
        doc.write(out);
        out.close();
        doc.close();

        System.out.println("Watermark added successfully!");

    }
    @Test
    public void 水印() throws Exception {
        //D:\Win10Driver\OneDrive\桌面\上海市临港地区人才租房补贴申请表.docx
        File file = new File("D:\\Win10Driver\\OneDrive\\桌面\\上海市临港地区人才租房补贴申请表.docx");
        File file2 = new File("D:\\Win10Driver\\OneDrive\\桌面\\上海市临港地区人才租房补贴申请表222.docx");
        File file3 = new File("D:\\Win10Driver\\OneDrive\\桌面\\身份证1.jpg");
        FileInputStream fileInputStream = new FileInputStream(file);
//        XWPFDocument xwpfDocument = new XWPFDocument(fileInputStream);
        // 加载现有的Word文档
        XWPFDocument doc = new XWPFDocument(fileInputStream);

        XWPFParagraph watermark = doc.createParagraph();

        XWPFRun run = watermark.createRun();

        run.addPicture(
                new FileInputStream(file3),
                XWPFDocument.PICTURE_TYPE_PNG,
                "watermark",
                500,
                500);
        FileOutputStream out = new FileOutputStream(file2);
        doc.write(out);
        out.close();
        doc.close();

        System.out.println("Watermark added successfully!");

    }
    /**
     * 插入图表 1
     *
     * @param document
     * @param index
     * @throws Exception
     */
    public void insertChartOne(XWPFDocument document, Integer index) throws Exception {
        // 填充图表数据
        DefaultPieDataset<String> dataset = new DefaultPieDataset<String>();
        dataset.setValue("碳水化合物(30%)", 30);
        dataset.setValue("蛋白质(30%)", 30);
        dataset.setValue("脂肪(25%)", 25);
        dataset.setValue("纤维等营养素(15%)", 15);
        // 创建图表示例
        InputStream chartPanel = ChartWithChineseExample.pieChartGeneration("营养成分摄入比例", dataset);
        // 获取所有段落
        List<XWPFParagraph> paragraphs = document.getParagraphs();
        // 在目标段落后添加一个新的段落
        XWPFParagraph paragraph = document.insertNewParagraph(paragraphs.get(index + 1).getCTP().newCursor().newCursor());
        // 设置段落的样式和属性，实现换行
        paragraph.setWordWrap(true); // 设置自动换行
        // 设置段落水平居中
        paragraph.setAlignment(ParagraphAlignment.CENTER);
        // 设置段落内文字（这里是空格）垂直居中
        paragraph.setVerticalAlignment(TextAlignment.CENTER);
        // 调整行距以确保图片上下居中，这一步可能需要根据实际情况调整
        XWPFRun run = paragraph.createRun();
        run.addPicture(chartPanel, XWPFDocument.PICTURE_TYPE_PNG, ChartWithChineseExample.BAR_CHART_FILE_NAME, Units.toEMU(400), Units.toEMU(300));
    }
}
